package interfaz;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.sql.DriverManager;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.RowFilter;
import javax.swing.table.TableRowSorter;
import javax.transaction.Transaction;

import org.hibernate.Session;

import dao.ClientesDAOImpl;
import dao.EmpleadosDAOImpl;
import dao.utils.HibernateUtil;
import domain.Clientes;
import domain.Empleados;

public class ClientesInterfaz extends JFrame implements ActionListener,
		KeyListener, MouseListener {

	private static final long serialVersionUID = 1L;

	private Login login;

	private JPanel panelPrincipal;

	// Botn del panel Izquierdo
	private JButton btnCambioUsuario = new JButton("Cambio de usuario",
			new ImageIcon("images/people.png"));

	private boolean esAdministrador;

	// Paneles
	private JPanel panelCentral;
	private JPanel panelIzquierdo;

	// Cuadros de texto del panel central
	private JTextField txtId = new JTextField();
	private JTextField txtDni = new JTextField();
	private JTextField txtNombre = new JTextField();
	private JTextField txtApellidos = new JTextField();
	private JTextField txtSocio = new JTextField();
	private JTextField txtPasswd = new JTextField();
	private JTextField txtMail = new JTextField();
	private JTextField txtTlf = new JTextField();
	private JTextField txtCalle = new JTextField();
	private JTextField txtPagado = new JTextField();
	private JTextField txtUtil = new JTextField();
	private JTextField txtnumCuenta = new JTextField();
	private JTextField txtNacimiento = new JTextField();
	private JTextField txtSexo = new JTextField();

	private JLabel lbMensajes = new JLabel(""); // Muestra mensajes por pantalla
	private JLabel lbId = new JLabel("ID");
	private JLabel lbDni = new JLabel("Dni");
	private JLabel lbNombre = new JLabel("Nombre");
	private JLabel lbApellidos = new JLabel("Apellidos");
	private JLabel lbSocio = new JLabel("Socio");
	private JLabel lbpasswd = new JLabel("Passwd");
	private JLabel lbMail = new JLabel("Email");
	private JLabel lbTlf = new JLabel("Telefono");
	private JLabel lbCalle = new JLabel("Calle");
	private JLabel lbPagado = new JLabel("Pagado");
	private JLabel lbUtil = new JLabel("Util");
	private JLabel lbnumCuenta = new JLabel("numCuenta");
	private JLabel lbNacimiento = new JLabel("Nacimiento");
	private JLabel lbSexo = new JLabel("Sexo");

	private JButton btnAlta = new JButton("Guardar");
	private JButton btnBaja = new JButton("Baja");
	private JButton btnModif = new JButton("Modificar");
	private JButton btnLimpiar = new JButton("Limpiar");

	private JScrollPane scrollPanel = null;
	private JTable table = null;
	private TableRowSorter<ModeloTabla> elQueOrdena;

	private JLabel lbGestionClientes;
	private JLabel lbAltaClientes;

	private ModeloTabla modelo;
	private ArrayList<Clientes> dniDel = new ArrayList<Clientes>();
	private Clientes cliente = new Clientes();

	public ClientesInterfaz(JPanel pCentral, JPanel pIzquierdo,
			JPanel pPrincipal, Login login) {

		this.login = login;
		panelCentral = pCentral;
		panelIzquierdo = pIzquierdo;

		panelCentral.removeAll();
		panelIzquierdo.removeAll();

		mostrarPanelCentralGestion();
		mostrarPanelIzquierdo();

		panelCentral.updateUI();
		panelIzquierdo.updateUI();
		panelPrincipal = pPrincipal;

		btnCambioUsuario.addActionListener(this);

	}

	public void mostrarPanelCentralGestion() {
		// Eliminamos todos los elementos del panelCentral;
		panelCentral.removeAll();
		// Inicializamos las variables de los JtextFields
		limpiarJTextFields();

		// Pone un borde y un título al panel
		panelCentral.setBorder(BorderFactory.createTitledBorder(BorderFactory
				.createLineBorder(new Color(255, 255, 255)),
				"GESTIÓN CLIENTES",
				javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
				javax.swing.border.TitledBorder.DEFAULT_POSITION, new Font(
						"Calibri", 1, 14), new Color(255, 255, 255)));

		panelCentral.setLayout(null);

		// Se añaden los componentes
		lbDni.setBounds(new Rectangle(75, 50, 140, 20));
		txtDni.setBounds(new Rectangle(220, 50, 80, 20));
		lbTlf.setBounds(new Rectangle(75, 75, 140, 20));
		txtTlf.setBounds(new Rectangle(220, 75, 80, 20));
		lbNombre.setBounds(new Rectangle(75, 100, 120, 20));
		txtNombre.setBounds(new Rectangle(220, 100, 200, 20));
		lbApellidos.setBounds(new Rectangle(75, 125, 120, 20));
		txtApellidos.setBounds(new Rectangle(220, 125, 200, 20));

		panelCentral.add(lbDni);
		panelCentral.add(txtDni);
		panelCentral.add(lbTlf);
		panelCentral.add(txtTlf);
		panelCentral.add(lbNombre);
		panelCentral.add(txtNombre);
		panelCentral.add(lbApellidos);
		panelCentral.add(txtApellidos);

		// Se añaden los escuchadores
		txtDni.addKeyListener(this);
		txtTlf.addKeyListener(this);
		txtNombre.addKeyListener(this);
		txtApellidos.addKeyListener(this);

		// Se añade la tabla con todos los registros. Dentro de este método
		// actualizamos los cambios del panelCentral
		// con panelCentral.updateUI()
		visualizarTabla();
	}

	public void mostrarPanelCentralAlta() {
		// Eliminamos todos los elementos del panelCentral;
		panelCentral.removeAll();
		// Inicializamos las variables de los JtextFields
		limpiarJTextFields();

		// Pone un borde y un título al panel
		panelCentral.setBorder(BorderFactory.createTitledBorder(BorderFactory
				.createLineBorder(new Color(255, 255, 255)), "ALTA CLIENTES",
				javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
				javax.swing.border.TitledBorder.DEFAULT_POSITION, new Font(
						"Calibri", 1, 14), new Color(255, 255, 255)));

		panelCentral.setLayout(null);

		// Se añaden los componentes
		lbId.setBounds(new Rectangle(75, 50, 50, 20));
		txtId.setBounds(new Rectangle(220, 50, 50, 20));
		lbDni.setBounds(new Rectangle(75, 75, 140, 20));
		txtDni.setBounds(new Rectangle(220, 75, 80, 20));
		lbTlf.setBounds(new Rectangle(75, 100, 140, 20));
		txtTlf.setBounds(new Rectangle(220, 100, 80, 20));
		lbNombre.setBounds(new Rectangle(75, 125, 120, 20));
		txtNombre.setBounds(new Rectangle(220, 125, 200, 20));
		lbApellidos.setBounds(new Rectangle(75, 150, 120, 20));
		txtApellidos.setBounds(new Rectangle(220, 150, 200, 20));
		lbSocio.setBounds(new Rectangle(75, 175, 50, 20));
		txtSocio.setBounds(new Rectangle(220, 175, 50, 20));
		lbpasswd.setBounds(new Rectangle(75, 200, 100, 20));
		txtPasswd.setBounds(new Rectangle(220, 200, 100, 20));

		lbMail.setBounds(new Rectangle(500, 50, 100, 20));
		txtMail.setBounds(new Rectangle(645, 50, 100, 20));
		lbNacimiento.setBounds(new Rectangle(500, 75, 125, 20));
		txtNacimiento.setBounds(new Rectangle(645, 75, 125, 20));
		lbCalle.setBounds(new Rectangle(500, 100, 125, 20));
		txtCalle.setBounds(new Rectangle(645, 100, 125, 20));
		lbPagado.setBounds(new Rectangle(500, 125, 50, 20));
		txtPagado.setBounds(new Rectangle(645, 125, 50, 20));
		lbSexo.setBounds(new Rectangle(500, 150, 50, 20));
		txtSexo.setBounds(new Rectangle(645, 150, 50, 20));
		lbUtil.setBounds(new Rectangle(500, 175, 50, 20));
		txtUtil.setBounds(new Rectangle(645, 175, 50, 20));

		panelCentral.add(lbId);
		panelCentral.add(txtId);
		panelCentral.add(lbDni);
		panelCentral.add(txtDni);
		panelCentral.add(lbTlf);
		panelCentral.add(txtTlf);
		panelCentral.add(lbNombre);
		panelCentral.add(txtNombre);
		panelCentral.add(lbApellidos);
		panelCentral.add(txtApellidos);
		panelCentral.add(lbSocio);
		panelCentral.add(txtSocio);
		panelCentral.add(lbSocio);
		panelCentral.add(txtSocio);
		panelCentral.add(lbpasswd);
		panelCentral.add(txtPasswd);
		panelCentral.add(lbMail);
		panelCentral.add(txtMail);
		panelCentral.add(lbNacimiento);
		panelCentral.add(txtNacimiento);
		panelCentral.add(lbCalle);
		panelCentral.add(txtCalle);
		panelCentral.add(lbPagado);
		panelCentral.add(txtPagado);
		panelCentral.add(lbSexo);
		panelCentral.add(txtSexo);
		panelCentral.add(lbUtil);
		panelCentral.add(txtUtil);

		// Se añaden los escuchadores
		txtId.addKeyListener(this);
		txtDni.addKeyListener(this);
		txtTlf.addKeyListener(this);
		txtNombre.addKeyListener(this);
		txtApellidos.addKeyListener(this);
		txtSocio.addKeyListener(this);
		txtPasswd.addKeyListener(this);
		txtMail.addKeyListener(this);
		txtNacimiento.addKeyListener(this);
		txtCalle.addKeyListener(this);
		txtPagado.addKeyListener(this);
		txtSexo.addKeyListener(this);
		txtUtil.addKeyListener(this);
		// actualizamos los cambios del panelCentral

		// Actualizamos el panelCentral para que se reflejen los cambios
		panelCentral.updateUI();

		anadeBotones();
	}

	public void limpiarJTextFields() {
		txtDni.setText("");
		txtTlf.setText("");
		txtNombre.setText("");
		txtApellidos.setText("");
		txtSocio.setText("");
		txtPasswd.setText("");
		txtMail.setText("");
		txtTlf.setText("");
		txtCalle.setText("");
		txtPagado.setText("");
		txtUtil.setText("");
		txtnumCuenta.setText("");
		txtNacimiento.setText("");
		txtSexo.setText("");

	}

	public void mostrarPanelIzquierdo() {

		// Pone un borde y un título al panel
		panelIzquierdo.setBorder(BorderFactory.createTitledBorder(BorderFactory
				.createLineBorder(new Color(255, 255, 255)), "MÓDULO CLIENTES",
				javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
				javax.swing.border.TitledBorder.DEFAULT_POSITION, new Font(
						"Calibri", 1, 14), new Color(255, 255, 255)));

		// Zona rígida (RigidArea): proporciona un área invisible de separación
		// horizontal y
		// vertical. En una caja horizontal, la separación vertical afectará a
		// todos sus
		// componentes y viceversa.
		Box caja = Box.createVerticalBox();

		// Se ponen las opciones disponibles para el módulo gestión de empleados
		// como etiquetas.
		lbGestionClientes = new JLabel("Gestión Clientes");
		// Se cambia el color de la etiqueta que va estar seleccionada por
		// defecto a un azul fuerte.
		lbGestionClientes.setForeground(new Color(0, 0, 128));
		// Se añade a la zona rígida.
		caja.add(lbGestionClientes);
		caja.add(Box.createRigidArea(new Dimension(40, 15)));
		
		lbAltaClientes = new JLabel("Alta Cliente");
		caja.add(lbAltaClientes);
		//caja.add(Box.createRigidArea(new Dimension(50, 30)));
		
		// Se añaden los escuchadores de los JLabels
		lbGestionClientes.addMouseListener(this);
		lbAltaClientes.addMouseListener(this);

		// Se aaden las restricciones a la fila 0, columna 0
		GridBagConstraints constraintsCaja = new GridBagConstraints();
		constraintsCaja.anchor = GridBagConstraints.NORTHWEST;
		constraintsCaja.gridx = 0; // El rea de texto empieza en la columna
									// cero.
		constraintsCaja.gridy = 0; // El rea de texto empieza en la fila cero
		constraintsCaja.insets = new Insets(0, 0, 345, 0);

		// Se aade la caja con sus restricciones al panelIzquierdo
		panelIzquierdo.add(caja, constraintsCaja);

		// Se aaden las restricciones a la fila 1, columna 0
		GridBagConstraints constraintsCambioUsuario = new GridBagConstraints();
		constraintsCambioUsuario.gridx = 0; // El rea de texto empieza en la
											// columna cero.
		constraintsCambioUsuario.gridy = 1; // El rea de texto empieza en la
											// fila cero

		// Se aade el botn cambio de usuario con sus restricciones al
		// panelIzquierdo
		panelIzquierdo.add(btnCambioUsuario, constraintsCambioUsuario);

		//panelIzquierdo.add(caja);
	}

	public void visualizarTabla() {

		Clientes cliente; // Utilizado para guardar los datos que vamos
							// extrayendo de la consulta

		// Borramos si hubiese alguna otra tabla, para poderla actualizar a la
		// actual
		if (scrollPanel != null) {
			panelCentral.remove(scrollPanel);
		}

		// Abrimos una sesión en Hibernate para poder realizar la consulta
		Session sesion = HibernateUtil.getSession();
		// Obtenemos todos los empleados de la tabla empleados de la Base de
		// datos del proyecto.

		List<Clientes> lista = new ClientesDAOImpl(sesion).findAll();

		Iterator<Clientes> iter = lista.iterator();

		modelo = new ModeloTabla();
		table = new JTable(modelo);

		// Añadimos los títulos de las columnas de la tabla
		modelo.addColumn("Dni");
		modelo.addColumn("Nombre");
		modelo.addColumn("Apellidos");
		modelo.addColumn("Socio");
		modelo.addColumn("Passwd");
		modelo.addColumn("Email");
		modelo.addColumn("Teléfono");
		modelo.addColumn("Calle");
		modelo.addColumn("Pagado");
		modelo.addColumn("Util");
		modelo.addColumn("NumCuenta");
		modelo.addColumn("Nacimiento");
		modelo.addColumn("Sexo");

		// Declaramos una fila con 7 columnas. Estas 7 columnas componen cada
		// fila de nuestra tabla de búsquedas.
		String[] fila = new String[13];
		// Recorremos el Iterador mientras hayan elementos
		while (iter.hasNext()) {
			// Extraemos el objeto del Iterador obtenido de la lista de
			// resultados de la consulta realizada con Hibernate a la
			// base de datos.
			cliente = (Clientes) iter.next();
			dniDel.add(cliente);
			// Extraemos los datos de cada columna
			fila[0] = cliente.getDni();
			fila[1] = cliente.getNombre();
			fila[2] = cliente.getApellido();
			// boolean tmp = cliente.isSocio();
			// if (tmp) {
			// fila[3] = "Si";
			// } else {
			// fila[3] = "No";
			// }
			fila[4] = cliente.getPass();
			fila[5] = cliente.getMail();
			fila[6] = cliente.getTelefono();
			fila[7] = cliente.getCalle();
			// String tmp2 = "No";
			// if(cliente.getPagado()==true){
			// tmp2 = "Si";
			// }
			// fila[8] = tmp2;
			// boolean tmp3 = cliente.getUtil();
			// if (tmp3) {
			// fila[9] = "Si";
			// } else {
			// fila[9] = "No";
			// }
			fila[10] = cliente.getNumeroCuenta();
			// fila[11] = cliente.getNacimiento().getDay() + "/"
			// + cliente.getNacimiento().getMonth() + "/"
			// + cliente.getNacimiento().getYear();
			// String tmp2="Mujer";
			// if(cliente.getSexo()==true){
			// tmp = "Hombre";
			// }else{
			// tmp = "Mujer";
			// }
			// fila[12] = tmp2;

			modelo.addRow(fila); // Añade una fila al final de la tabla

		}

		elQueOrdena = new TableRowSorter<ModeloTabla>(modelo);
		table.setRowSorter(elQueOrdena);

		// Hacemos que sólo se pueda seleccionar una fila de la tabla
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

		// Bloqueamos que las columnas de la tabla se pueden deslizar y cambiar
		// de posicion con el movimiento del mouse
		table.getTableHeader().setReorderingAllowed(false);

		// Le añadimos un scroll a la tabla
		scrollPanel = new JScrollPane(table);
		scrollPanel.setBounds(new Rectangle(75, 200, 1000, 150));
		panelCentral.add(scrollPanel);

		// Se añaden los botones Modificar, Baja y Limpiar
		btnModif.setBounds(new Rectangle(330, 400, 130, 30));
		btnBaja.setBounds(new Rectangle(480, 400, 130, 30));
		btnLimpiar.setBounds(new Rectangle(630, 400, 130, 30));
		panelCentral.add(btnModif);
		panelCentral.add(btnBaja);
		panelCentral.add(btnLimpiar);

		// Se añaden los escuchadores de los botones Modificar, Baja y Limpiar
		btnModif.addActionListener(this);
		btnBaja.addActionListener(this);
		btnLimpiar.addActionListener(this);
		table.addMouseListener(this);

		// Actualizamos el panelCentral para que se reflejen los cambios y
		// cerramos la sesión de Hibernate
		panelCentral.updateUI();
		HibernateUtil.closeSession();
	}

	public void anadeBotones() {

		// Se añaden los botones Modificar, Baja y Limpiar
		btnAlta.setBounds(new Rectangle(330, 250, 130, 30));
		panelCentral.add(btnAlta);
		btnLimpiar.setBounds(new Rectangle(630, 250, 130, 30));
		panelCentral.add(btnLimpiar);

		// Se añaden los escuchadores de los botones Alta y Limpiar
		btnAlta.addActionListener(this);
		btnLimpiar.addActionListener(this);
		// Actualizamos el panelCentral para que se reflejen los cambios y
		// cerramos la sesión de Hibernate
		panelCentral.updateUI();
		//HibernateUtil.closeSession();
	}

	public void actionPerformed(ActionEvent e) {

		if (e.getSource() == btnAlta) { // Se pulsa el botón Alta
			try {
				Clientes cliente = new Clientes();
				cliente.setDni(txtDni.getText());
				cliente.setNombre(txtNombre.getText());
				cliente.setApellido(txtApellidos.getText());

				boolean tmp = false;
				if (Integer.parseInt(txtSocio.getText()) == 1) {
					tmp = true;
				}
				cliente.setSocio(tmp);
				cliente.setPass(txtPasswd.getText());
				cliente.setMail(txtMail.getText());
				cliente.setTelefono(txtTlf.getText());
				cliente.setCalle(txtCalle.getText());
				boolean tmp2 = false;
				if (Integer.parseInt(txtPagado.getText()) == 1) {
					tmp2 = true;
				}
				cliente.setPagado(tmp2);
				cliente.setUtil(true);
				cliente.setNumeroCuenta(txtnumCuenta.getText());

				Date fecha = new Date();
				cliente.setNacimiento(fecha);
				cliente.setSexo(true);

				Session sesion = HibernateUtil.getSession();
				HibernateUtil.beginTransaction();
				boolean clie = new ClientesDAOImpl(sesion).guardarCliente(
						cliente.getDni(), sesion, cliente);
				HibernateUtil.endTransaction();
				// HibernateUtil.closeSession();
				JOptionPane.showMessageDialog(null, "Cliente insertado");
			} catch (Exception e2) {
				JOptionPane.showMessageDialog(null, e2.getMessage());
			}

		}

		if (e.getSource() == btnModif) { // Se pulsa el botón Modificar

		}

		if (e.getSource() == btnBaja) { // Se pulsa el botón Baja

			int seleccion = JOptionPane.showOptionDialog(this,
					"¿Confirma que quiere borrar el registro?",
					"Selector de opciones", JOptionPane.YES_NO_CANCEL_OPTION,
					JOptionPane.QUESTION_MESSAGE, null, // null para icono por
														// defecto.
					new Object[] { "Si", "No" }, // null para YES, NO y CANCEL
					"opcion 1");
			if (seleccion == JOptionPane.YES_OPTION) {
				// BORRAR
				Session sesion = HibernateUtil.getSession();
				HibernateUtil.beginTransaction();
				boolean clie = new ClientesDAOImpl(sesion).borrarCliente(
						cliente.getDni(), sesion, cliente);
				HibernateUtil.endTransaction();
				HibernateUtil.closeSession();

				JOptionPane
						.showMessageDialog(null, "Cliente borrado con éxito");

			} else if (seleccion == JOptionPane.NO_OPTION)
				JOptionPane.showMessageDialog(null, "Error al borrar cliente");
		}

		if (e.getSource() == btnLimpiar) { // Se pulsa el botón Limpiar
			// Muestra todos los registros de la tabla. Se han quitado los
			// filtros
			elQueOrdena.setRowFilter(null);
			// Inicializamos las variables de los JtextFields
			limpiarJTextFields();
		}

		if (e.getSource() == btnCambioUsuario) { // Se
			// pulsa
			// el
			// botn
			// Cambio
			// de
			// Usuario
			int seleccion = JOptionPane.showConfirmDialog(this,
					"ÀDesea realmente cambiar de usuario?",
					"Cambio de usuario", JOptionPane.YES_NO_OPTION);
			if (seleccion == JOptionPane.YES_OPTION) {
				// Se llama al objeto Login para que vuelva cargar el login de
				// la aplicacin a travs del mtodo iniciar
				login.iniciar(panelPrincipal);
			}
		}
	}

	public void mouseClicked(MouseEvent e) {
		if (e.getSource() == lbGestionClientes) { // Se pulsa la etiqueta del
													// panel Izquierdo Gestión
													// de empleados
			mostrarPanelCentralGestion();
			// Se cambia el color de la etiqueta Gestión de empleados a un azul
			// fuerte.
			lbGestionClientes.setForeground(new Color(0, 0, 128));
			// Se cambia el color de la etiqueta Alta de empleados a negro.
			lbAltaClientes.setForeground(new Color(0, 0, 0));
		}
		if (e.getSource() == lbAltaClientes) { // Se pulsa la etiqueta del panel
												// Izquierdo Alta de empleados
			mostrarPanelCentralAlta();
			// Se cambia el color de la etiqueta Alta de empleados a un azul
			// fuerte.
			lbAltaClientes.setForeground(new Color(0, 0, 128));
			// Se cambia el color de la etiqueta Alta de empleados a negro.
			lbGestionClientes.setForeground(new Color(0, 0, 0));
		}

		if (e.getSource() == table) {
			int fila = table.rowAtPoint(e.getPoint());
			if ((fila > -1)) {
				txtDni.setText(modelo.getValueAt(fila, 0).toString());
				cliente = dniDel.get(fila);
			}
		}

	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	public void keyReleased(KeyEvent e) {

		// Extraemos los datos de los JTextField
		String dni = txtDni.getText();
		String tlf = txtTlf.getText();
		String nombre = txtNombre.getText();
		String apellidos = txtApellidos.getText();

		// Suponemos que en dni y tlf no van a haber acentos
		// Hacemos que nombre sea insensible a acentos
		nombre = nombre.replace("a", "(a|á|A|Á)");
		nombre = nombre.replace("e", "(e|é|E|É)");
		nombre = nombre.replace("i", "(i|í|I|Í)");
		nombre = nombre.replace("o", "(o|ó|O|Ó)");
		nombre = nombre.replace("u", "(u|ú|U|Ú)");
		nombre = nombre.replace("A", "(a|á|A|Á)");
		nombre = nombre.replace("E", "(e|é|E|É)");
		nombre = nombre.replace("I", "(i|í|I|Í)");
		nombre = nombre.replace("O", "(o|ó|O|Ó)");
		nombre = nombre.replace("U", "(u|ú|U|Ú)");

		// Hacemos que apellidos sea insensible a acentos
		apellidos = apellidos.replace("a", "(a|á|A|Á)");
		apellidos = apellidos.replace("e", "(e|é|E|É)");
		apellidos = apellidos.replace("i", "(i|í|I|Í)");
		apellidos = apellidos.replace("o", "(o|ó|O|Ó)");
		apellidos = apellidos.replace("u", "(u|ú|U|Ú)");
		apellidos = apellidos.replace("A", "(a|á|A|Á)");
		apellidos = apellidos.replace("E", "(e|é|E|É)");
		apellidos = apellidos.replace("I", "(i|í|I|Í)");
		apellidos = apellidos.replace("O", "(o|ó|O|Ó)");
		apellidos = apellidos.replace("U", "(u|ú|U|Ú)");

		// Establecemos los filtros.
		if (dni.equals("")) {
			if (tlf.equals("")) {
				if (nombre.equals("")) {
					if (apellidos.equals("")) {
						// Muestra todos los registros. Se han quitado los
						// filtros
						elQueOrdena.setRowFilter(null);
					} else {
						/*------------------------------FILTRA POR APELLIDOS--------------------------------*/
						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i)
						elQueOrdena.setRowFilter(RowFilter.regexFilter("(?i).*"
								+ apellidos + ".*", 2));
					}
				} else {
					if (apellidos.equals("")) {
						/*------------------------------FILTRA POR NOMBRE--------------------------------*/
						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i)
						elQueOrdena.setRowFilter(RowFilter.regexFilter("(?i).*"
								+ nombre + ".*", 1));
					} else {
						/*-------------------------FILTRA POR NOMBRE Y APELLIDOS----------------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + nombre
								+ ".*", 1));
						lista.add(RowFilter.regexFilter("(?i).*" + apellidos
								+ ".*", 2));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					}
				}
			} else {
				if (nombre.equals("")) {
					if (apellidos.equals("")) {
						/*------------------------------FILTRA POR TELÉFONO--------------------------------*/
						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i)
						elQueOrdena.setRowFilter(RowFilter.regexFilter("(?i).*"
								+ tlf + ".*", 3));
					} else {
						/*-------------------------FILTRA POR TELÉFONO Y APELLIDOS----------------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + tlf + ".*",
								3));
						lista.add(RowFilter.regexFilter("(?i).*" + apellidos
								+ ".*", 2));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					}
				} else {
					if (apellidos.equals("")) {
						/*-------------------------FILTRA POR TELÉFONO Y NOMBRE----------------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + tlf + ".*",
								3));
						lista.add(RowFilter.regexFilter("(?i).*" + nombre
								+ ".*", 1));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					} else {
						/*----------------------FILTRA POR TELÉFONO, NOMBRE Y APELLIDOS------------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + tlf + ".*",
								3));
						lista.add(RowFilter.regexFilter("(?i).*" + nombre
								+ ".*", 1));
						lista.add(RowFilter.regexFilter("(?i).*" + apellidos
								+ ".*", 2));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					}
				}
			}
		} else {
			if (tlf.equals("")) {
				if (nombre.equals("")) {
					if (apellidos.equals("")) {
						/*------------------------------FILTRA POR DNI--------------------------------*/
						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i)
						elQueOrdena.setRowFilter(RowFilter.regexFilter("(?i).*"
								+ dni + ".*", 0));
					} else {
						/*-------------------------FILTRA POR DNI Y APELLIDOS----------------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + dni + ".*",
								0));
						lista.add(RowFilter.regexFilter("(?i).*" + apellidos
								+ ".*", 2));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					}
				} else {
					if (apellidos.equals("")) {
						/*-------------------------FILTRA POR DNI Y NOMBRE----------------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + dni + ".*",
								0));
						lista.add(RowFilter.regexFilter("(?i).*" + nombre
								+ ".*", 1));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					} else {
						/*----------------------FILTRA POR DNI, NOMBRE Y APELLIDOS------------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + dni + ".*",
								0));
						lista.add(RowFilter.regexFilter("(?i).*" + nombre
								+ ".*", 1));
						lista.add(RowFilter.regexFilter("(?i).*" + apellidos
								+ ".*", 2));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					}
				}
			} else {
				if (nombre.equals("")) {
					if (apellidos.equals("")) {
						/*-------------------------FILTRA POR DNI Y TELÉFONO----------------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + dni + ".*",
								0));
						lista.add(RowFilter.regexFilter("(?i).*" + tlf + ".*",
								3));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					} else {
						/*----------------------FILTRA POR DNI, TELÉFONO Y APELLIDOS------------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + dni + ".*",
								0));
						lista.add(RowFilter.regexFilter("(?i).*" + tlf + ".*",
								3));
						lista.add(RowFilter.regexFilter("(?i).*" + apellidos
								+ ".*", 2));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					}
				} else {
					if (apellidos.equals("")) {
						/*---------------------FILTRA POR DNI, TELÉFONO Y NOMBRE-----------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + dni + ".*",
								0));
						lista.add(RowFilter.regexFilter("(?i).*" + tlf + ".*",
								3));
						lista.add(RowFilter.regexFilter("(?i).*" + nombre
								+ ".*", 1));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					} else {
						/*--------------------FILTRA POR DNI, TELÉFONO, NOMBRE Y APELLIDOS----------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + dni + ".*",
								0));
						lista.add(RowFilter.regexFilter("(?i).*" + tlf + ".*",
								3));
						lista.add(RowFilter.regexFilter("(?i).*" + nombre
								+ ".*", 1));
						lista.add(RowFilter.regexFilter("(?i).*" + apellidos
								+ ".*", 2));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					}
				}
			}
		}
	}

	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub

	}

}
